A computer program can be tested by feeding it input values and comparing the resulting behavior and output to what is expected. However, the testing of any except the simplest program is likely to be incomplete, in that many aspects of the program's possible behavior are not exercised during testing. For instance, many programs can be given an extremely large number of different input values. A program might accept an email address, telephone number, or other input from a collection of possible inputs that includes both an arbitrarily large number of valid values and an arbitrarily large number of invalid values. Also, the number of different paths a program might take during execution can be immense. If a given program contains twenty decision points with corresponding decision conditions where execution follows one branch if the condition is true and another branch when the condition is false, then there are over a million different paths through that program. Widely available software applications can have thousands of such decision points, not a mere twenty, and the number of paths through an application program's code grows accordingly.
A computer program can be tested manually by a person who feeds the program input values, but many programs are now tested at least in part by automated tests. Test automation tools feed inputs to a program under test, and automatically check the resulting behavior and output against criteria specified in a testing suite. Automated testing makes it possible to test programs more thoroughly, and in a more consistent manner. But even with automated testing it may happen that some aspects of a program are not exercised, or in some way are otherwise not fully tested. For instance, not even an automated test can input every possible email address, telephone number, or other input to a program to check that the program behaves correctly for each input. Also, for most if not all commercial programs, automating the testing of the program does not inherently provide the computing resources that would be needed to execute every single path that can be taken through the program, so many paths go untested.